package com.seeyon.apps.kkSample.utils.cap4;

import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumBean;
import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem;
import org.apache.commons.logging.Log;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 枚举工具类 - 提供枚举项与枚举类型的快速查询能力
 *
 * <p>本工具类基于Ctpenumnew模块的枚举管理器实现，提供以下核心功能：
 * 1. 根据枚举项ID快速获取编码/显示值/真实值等属性
 * 2. 通过枚举类型名称和枚举值反向查找枚举项ID
 * 3. 支持枚举项的缓存机制提升查询性能</p>
 *
 * @see com.seeyon.ctp.common.ctpenumnew.manager.EnumManager
 */
public class EnumUtils {
    private static final Log log = CtpLogFactory.getLog(EnumUtils.class);
    private static final Log LOGGER = CtpLogFactory.getLog(EnumUtils.class);

    /**
     * 枚举-枚举项 映射Map
     */
    private static final Map<Long, List<CtpEnumItem>> enumMap = new HashMap<Long, List<CtpEnumItem>>();

    /**
     * 单位所有枚举
     */
    private static List<CtpEnumBean> ctpEnumList;

    /**
     * 枚举管理
     */
    private static final EnumManager enumManager = (EnumManager) AppContext.getBean("enumManagerNew");

    /**
     * 根据枚举ID 获取枚举key
     *
     * @param enumItemId 枚举ID
     * @return 枚举显示值
     */
    public static String getEnumItemKey(Long enumItemId) throws BusinessException {
        CtpEnumItem item = enumManager.getEnumItem(enumItemId);
        if (null != item) {
            return item.getValue();
        }
        LOGGER.info("没有获取到枚举:" + enumItemId);
        return "";
    }

    public static String getEnumItemShowValue(Long enumItemId) throws BusinessException {
        CtpEnumItem item = enumManager.getEnumItem(enumItemId);
        if (null != item) {
            return item.getShowvalue();
        }
        LOGGER.info("没有获取到枚举:" + enumItemId);
        return "";
    }

    public static String getEnumItemCode(Long enumItemId) throws BusinessException {
        CtpEnumItem item = enumManager.getEnumItem(enumItemId);
        if (null != item) {
            return item.getEnumItemCode();
        }
        LOGGER.info("没有获取到枚举:" + enumItemId);
        return "";
    }


    /**
     * 根据枚举项编码获取对应ID
     *
     * @param enumItemIdCode 枚举项编码（对应CtpEnumItem.enumItemCode）
     * @return 匹配的枚举项ID，未找到时返回0L
     * @throws BusinessException 当枚举管理器操作异常时抛出
     */
    public static Long getEnumItemIdByCode(String enumItemIdCode) throws BusinessException {
        CtpEnumItem item = enumManager.getItemByCode(enumItemIdCode);
        if (null != item) {
            return item.getId();
        }
        LOGGER.info("没有获取到枚举:" + enumItemIdCode);
        return 0L;
    }

    public static String getEnumItemValue(Long enumItemId) throws BusinessException {
        CtpEnumItem item = enumManager.getEnumItem(enumItemId);
        if (null != item) {
            return item.getEnumvalue();
        }
        LOGGER.info("没有获取到枚举:" + enumItemId);
        return "";
    }

    /**
     * 根据枚举ID 获取枚举显示值
     *
     * @param enumItemId 枚举ID
     * @return 枚举显示值
     */
    public static String getEnumItemName(String enumItemId) {
        if (null == enumItemId || "".equals(enumItemId)) {
            return "";
        }
        String enumItemName = "";
        try {
            enumItemName = enumManager.getEItemNameById(Long.valueOf(enumItemId));
        } catch (BusinessException e) {
            LOGGER.error("获取枚举错误:", e);
        }
        return enumItemName;
    }

    /**
     * 根据枚举类型名及枚举显示值 获取枚举项的ID
     *
     * @param enumTypeName 枚举类型名
     * @param enumItemName 枚举值
     * @return 枚举ID
     * @throws Exception 异常
     */
    public static Long getEnumItemId(String enumTypeName, String enumItemName) {
        try {
            // 查询单位所有枚举
            ctpEnumList = enumManager.getAllOrgCtpEnum();
            ctpEnumList.addAll(enumManager.getBusinessEnums());
            for (CtpEnumBean enumBean : ctpEnumList) {
                if (enumTypeName.equals(enumBean.getLabel())) {
                    if (!enumMap.containsKey(enumBean.getId())) {
                        enumMap.put(enumBean.getId(), enumManager.getEmumItemByEmumId(enumBean.getId()));
                    }
                    for (CtpEnumItem item : enumMap.get(enumBean.getId())) {
                        if (enumItemName.equals(item.getShowvalue())) {
                            return item.getId();
                        }
                    }
                }
            }
            String errorInfo = "枚举类型：" + enumTypeName + "下面没有枚举值为[" + enumItemName + "] 的选项";
            throw new Exception(errorInfo);
        } catch (Exception e) {
            LOGGER.error("获取枚举错误:", e);
        }
        // 先解决一个BUG，返回空的话查询出错
        return 0L;
    }

    public static String getEnumItemkey(String enumTypeName, String enumItemName) {
        try {
            // 查询单位所有枚举
            ctpEnumList = enumManager.getAllOrgCtpEnum();
            for (CtpEnumBean enumBean : ctpEnumList) {
                if (enumTypeName.equals(enumBean.getLabel())) {
                    if (!enumMap.containsKey(enumBean.getId())) {
                        enumMap.put(enumBean.getId(), enumManager.getEmumItemByEmumId(enumBean.getId()));
                    }
                    for (CtpEnumItem item : enumMap.get(enumBean.getId())) {
                        if (enumItemName.equals(item.getShowvalue())) {
                            return item.getValue();
                        }
                    }
                }
            }
            String errorInfo = "枚举类型：" + enumTypeName + "下面没有枚举值为[" + enumItemName + "] 的选项";
            throw new Exception(errorInfo);
        } catch (Exception e) {
            LOGGER.error("获取枚举错误:", e);
        }
        // 先解决一个BUG，返回空的话查询出错
        return "";
    }

    /**
     * 根据枚举类型名获取枚举
     *
     * @param enumTypeName 枚举类型名
     * @return 枚举ID
     * @throws Exception 异常
     */
    public static List<CtpEnumItem> getEnumItemId(String enumTypeName) {
        try {
            // 查询单位所有枚举
            ctpEnumList = enumManager.getAllOrgCtpEnum();
            for (CtpEnumBean enumBean : ctpEnumList) {
                if (enumTypeName.equals(enumBean.getLabel())) {
                    return enumManager.getEmumItemByEmumId(enumBean.getId());
                }
            }
        } catch (Exception e) {
            LOGGER.error("获取枚举错误:", e);
        }
        // 先解决一个BUG，返回空的话查询出错
        return null;
    }


    /**
     * 根据枚举类型名及枚举值 获取枚举项的ID
     *
     * @param enumTypeName 枚举类型名
     * @param enumItemName 枚举值
     * @return 枚举ID
     * @throws Exception 异常
     */
    public static String getEnumItemIdByKey(String enumTypeName, String enumItemKey) {
        try {
            // 查询单位所有枚举
            // if(ctpEnumList == null) {
            ctpEnumList = enumManager.getAllOrgCtpEnum();
            // }
            for (CtpEnumBean enumBean : ctpEnumList) {
                if (enumTypeName.equals(enumBean.getLabel())) {
                    if (!enumMap.containsKey(enumBean.getId())) {
                        enumMap.put(enumBean.getId(), enumManager.getEmumItemByEmumId(enumBean.getId()));
                    }
                    for (CtpEnumItem item : enumMap.get(enumBean.getId())) {
                        if (enumItemKey.equals(item.getValue())) {
                            return String.valueOf(item.getId());
                        }
                    }
                }
            }
            String errorInfo = "枚举类型：" + enumTypeName + "下面没有枚举值为[" + enumItemKey + "] 的选项";
            throw new Exception(errorInfo);
        } catch (Exception e) {
            LOGGER.error("获取枚举错误:", e);

        }
        return null;
    }

}
